home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / common / exec.c < prev    next >
C/C++ Source or Header  |  2004-05-09  |  4KB  |  193 lines

  1. /*-------------------------------------------------------------
  2.   exec.c : executing a file
  3.   (C) 1997-2004 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "common.h"
  10.  
  11. #define PATH_REL 0
  12. #define PATH_ABS 1
  13. #define PATH_URL 2
  14.  
  15. /* Globals */
  16. void RelToAbs(char *dst, const char *src);
  17. void GetFileAndOption(const char* command, char* fname, char* option);
  18. BOOL ExecFile(HWND hwnd, const char* command);
  19.  
  20. /* Statics */
  21. static int GetPathType(const char *src);
  22. static BOOL GetRealFileName(char *dst, const char *src);
  23.  
  24. extern HINSTANCE g_hInst;
  25. extern char g_mydir[];
  26.  
  27. /*------------------------------------------------
  28.   relative path -> absolute path
  29. --------------------------------------------------*/
  30. void RelToAbs(char *dst, const char *src)
  31. {
  32.     if(GetPathType(src) == PATH_REL)
  33.     {
  34.         strcpy(dst, g_mydir);
  35.         add_title(dst, src);
  36.     }
  37.     else
  38.         strcpy(dst, src);
  39. }
  40.  
  41. /*--------------------------------------------------------
  42.   Retreive a file name and option from a command string
  43. ----------------------------------------------------------*/
  44. void GetFileAndOption(const char* command, char* fname, char* option)
  45. {
  46.     const char *p;
  47.     char *dp;
  48.     const char *pspace, *pfound;
  49.     char tempfname[MAX_PATH], foundfname[MAX_PATH];
  50.     BOOL bFound = FALSE;
  51.     
  52.     p = command;
  53.     dp = tempfname;
  54.     pspace = pfound = NULL;
  55.     
  56.     while(1)
  57.     {
  58.         if(*p == ' ' || *p == 0)
  59.         {
  60.             if(!pspace) pspace = p;
  61.             
  62.             *dp = 0;
  63.             
  64.             if(GetRealFileName(foundfname, tempfname))
  65.             {
  66.                 strcpy(fname, foundfname);
  67.                 bFound = TRUE; pfound = p;
  68.             }
  69.             
  70.             if(*p == 0) break;
  71.         }
  72.         *dp++ = *p++;
  73.     }
  74.     
  75.     if(bFound)
  76.     {
  77.         p = pfound;
  78.     }
  79.     else
  80.     {
  81.         p = command;
  82.         dp = fname;
  83.         while(p != pspace) *dp++ = *p++;
  84.         *dp = 0;
  85.     }
  86.     
  87.     while(*p == ' ') p++;
  88.     while(*p) *option++ = *p++;
  89.     *option = 0;
  90. }
  91.  
  92. /*------------------------------------------------
  93.   Open a file
  94. --------------------------------------------------*/
  95. BOOL ExecFile(HWND hwnd, const char* command)
  96. {
  97.     char fname[MAX_PATH], path[MAX_PATH];
  98.     char *option;
  99.     SHELLEXECUTEINFO sei;
  100.     
  101.     if(*command == 0) return FALSE;
  102.     
  103.     option = malloc(strlen(command));
  104.     if(option == NULL) return FALSE;
  105.     
  106.     memset(&sei,0,sizeof(sei));
  107.     sei.cbSize = sizeof(sei);
  108.     sei.nShow = SW_SHOW;
  109.     
  110.     if(GetPathType(command) != PATH_URL)
  111.     {
  112.         GetFileAndOption(command, fname, option);
  113.         
  114.         if(GetPathType(fname) == PATH_ABS)
  115.         {
  116.             strcpy(path, fname);
  117.             del_title(path);
  118.         }
  119.         else strcpy(path, g_mydir);
  120.         
  121.         /*
  122.         WriteDebug(fname);
  123.         WriteDebug(path);
  124.         WriteDebug(option);
  125.         */
  126.         
  127.         sei.lpFile = fname;
  128.         sei.lpDirectory = path;
  129.         sei.lpParameters = option[0] ? option : NULL;
  130.     }
  131.     else
  132.     {
  133.         sei.lpFile = command;
  134.         sei.lpDirectory = g_mydir;
  135.         sei.lpParameters = NULL;
  136.     }
  137.     
  138.     ShellExecuteEx(&sei);
  139.     
  140.     free(option);
  141.     
  142.     return ((int)sei.hInstApp > 32);
  143. }
  144.  
  145. /*------------------------------------------------
  146.   relative path / absolute path / URL
  147. --------------------------------------------------*/
  148. int GetPathType(const char *src)
  149. {
  150.     const char *p = src;
  151.     
  152.     if(*p == '\\' && *(p + 1) == '\\') return PATH_ABS;
  153.     else if((('A' <= *p && *p <= 'Z') || ('a' <= *p && *p <= 'z')) &&
  154.         *(p + 1) == ':') return PATH_ABS;
  155.     else
  156.     {
  157.         while(*p &&
  158.             (('A' <= *p && *p <= 'Z') || ('a' <= *p && *p <= 'z')))
  159.         {
  160.             if(*p == ':') return PATH_URL;
  161.             p++;
  162.         }
  163.     }
  164.     return PATH_REL;
  165. }
  166.  
  167. /*------------------------------------------------
  168.   find a file and add path
  169. --------------------------------------------------*/
  170. BOOL GetRealFileName(char *dst, const char *src)
  171. {
  172.     char fname[MAX_PATH];
  173.     int type;
  174.     
  175.     type = GetPathType(src);
  176.     
  177.     if(type == PATH_REL)
  178.     {
  179.         strcpy(fname, g_mydir);
  180.         add_title(fname, src);
  181.     }
  182.     else
  183.         strcpy(fname, src);
  184.     
  185.     if(IsFile(fname))
  186.     {
  187.         strcpy(dst, fname);
  188.         return TRUE;
  189.     }
  190.     else
  191.         return FALSE;
  192. }
  193.